#ifndef __BLOCKING_QUEUE_H__
#define __BLOCKING_QUEUE_H__

#include <boost/utility.hpp>
#include "mutex_lock.h"
#include "condition.h"

namespace mars{

/*
 * @brief 无界阻塞队列
 */
template <typename T>
class BlockingQueue {
	public:
		BlockingQueue() : 
			_mutex(),
	 		_not_empty(),
 			_queue() {
		}

		/*
		 * @brief 向队列插入元素
		 * @param e 
		 */
		void put(const T& e) {
			MutexLockGuard guard(_mutex);
			_queue.push_back(e);
			_not_empty.notify();
		}

		/*
		 * @brief 从队列取元素，如果队列为空，会阻塞调用线程
		 * @return 返回获取的元素
		 */
		T take() {
			MutexLockGuard guard(_mutex);
			while(_queue.empty()) {
				_not_empty.wait(_mutex);
			}
			T front(_queue.front());
			_queue.pop_front();
			return front;
		}

	private:
		std::list<T> _queue;
		MutexLock _mutex;
		Condition _not_empty; // 不为空的条件
};

} // namespace mars


#endif // __BLOCKING_QUEUE_H__
